package com.hui.base;

import com.alibaba.fastjson.JSON;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: 李昭辉
 * @Date: 2021/07/11/11:25
 * @Description:
 */
public class BaseServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String methodName = null;
        // 获取数据提交格式
        String ContentType = req.getHeader("Content-Type");
        // 如果数据是 JSON 的格式，需要解析
        if ("application/json;charset=utf-8".equalsIgnoreCase(ContentType)) {

            String JsonDate = getPostJSON(req);
            // 将 JSON 字符串转换成 map 类型
            Map<String, Object> map = JSON.parseObject(JsonDate, Map.class);
            // 获取请求的 功能
            methodName = (String) map.get("methodName");
            // 将其他的数据保存到 request域 中
            req.setAttribute("map", map);

        } else { // 普通模式,可以直接获取
            methodName = req.getParameter("methodName");
        }

        if (methodName != null) {
            // 通过反射优化代码
            try {
                // 通过方法名与获取相关方法
                Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
                // 调用方法
                method.invoke(this, req, resp);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("没有该方法！！！");
            }
        }

//        if (method.equals("delete")) {
//            delete(req, resp);
//        } else if (method.equals("update")) {
//            update(req, resp);
//        } else if (method.equals("add")) {
//            add(req, resp);
//        } else {
//            System.out.println("没有该方法!!!");
//        }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    /**
     * POST请求格式为 application/json;charset=utf-8
     * 在这个方法中我们使用流的方式,获取到POST请求的数据
     */
    public String getPostJSON(HttpServletRequest req) {
        try {
            // 保存JSON数据
            StringBuffer sb = new StringBuffer();
            // 获取 BufferedReader 流
            BufferedReader reader = req.getReader();
            // 读取流中的数据，保存到 sb 中
            String temp = null;
            while ((temp = reader.readLine()) != null) {
                sb.append(temp);
            }
            reader.close();
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
